# -*- codeing = utf-8 -*-
# @Time : 2021/2/27 16:00
# @Atuthor: 朱朱
# @File: 136json的使用.py
# @Software: PyCharm
""
"""
# 序列化:将数据从内存持久化保存到硬盘的过程
# 反序列化:将数据从硬盘加载到内存的过程

# write时，只能写入字符串或者二进制
# 字典、列表、数字等都不能直接写入到文件里

# 将数据转换成为字符串: repr/str  使用json模块
# json 本质就是字符串，区别在于json里要是用"双引号表示字符串"
# 将数据转换成为二进制: 使用pickle模块
"""
import json

#  json里将数据持久有两个方法:
# dumps:将数据转换成为json字符串,不会将数据保存到文件里。
# dump: 将数据转换成为json字符串的同时写入到指定文件。

names = ['jack','tony','tom','luck']
f = json.dumps(names) # dumps的作用是将数据转换为字符串
print(f)    # ["jack", "tony", "tom", "luck"]

f2 = open('names.txt','w',encoding='utf8')
f2.write(f) # ["jack", "tony", "tom", "luck"]
f2.close()

f3 = open('names2.txt', 'w',encoding='utf8')
json.dump(names,f3) # 将数据转换为json字符串,同时写入到文件里
f3.close()
print('---------------------------------')

# json 反序列化也有两个方法:
# loads: 读取 'json字符串' 加载成为Python里的 数据
# load: 读取 '文件' ，把读取的内容加载成为Python里的数据

j1 = '{"name":"jack","age":18,"city":"shandong"}' # 符合json规则的字符串
j2 = json.loads(j1)
print(j2) # python中的字典 {'name': 'jack', 'age': 18, 'city': 'shandong'}
print(j2['name'])
print('--------------------------')

j3 = open('names.txt','r', encoding='utf8')
j4 = json.load(j3) # 读取j3
print(type(j4)) # <class 'list'>
print(j4)   # ['jack', 'tony', 'tom', 'luck']
print(j4[0])
print('--------------------------')

class Person(object):
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def eat(self):
        print(self.name + '正在吃东西........')

p = Person('jack',18)
print(p.__dict__) # {'name': 'jack', 'age': 18}
j5 = json.dumps(p.__dict__)
print(type(j5))
print(j5) # {"name": "jack", "age": 18}
y = json.loads(j5)
print(y) # {'name': 'jack', 'age': 18}

